Перейти к основному содержимому

Тренировка алгоритмического мышления

Разработчику Аналитику Тестировщику
Архитектору Инженеру

Тренировка алгоритмического мышления

Мы разобрали теорию того, как работает алгоритм. Теперь давайте тренироваться, и изучать на основе примерах из реальной жизни. Это должно показать нам, как на самом деле выглядят алгоритмы в программировании.

Повторите для себя:

  • что такое алгоритм;
  • линейный и нелинейный алгоритм;
  • причинно-следственную связь;
  • события;
  • условия;
  • действия.

Основная мысль заключается в том, что можно проецировать объекты в системах реального мира на цифровой лад, и воссоздавать приближенные к реальности алгоритмы и процессы, используя те же сущности, но в виртуальной среде.

Давайте посмотрим.


Базовые линейные сценарии

Линейный алгоритм представляет собой последовательность шагов, где каждый следующий шаг выполняется строго после предыдущего. Нет условий, нет ветвлений, только чёткий порядок действий от начала до конца. Такие алгоритмы часто лежат в основе простых бытовых процессов и базовых операций в коде.

1. Приготовление бутерброда Событие: Человек решил перекусить. Условие: На столе есть хлеб, колбаса, нож и тарелка. Действие: Взять кусок хлеба → Положить на тарелку → Нарезать колбасу → Выложить ломтики на хлеб → Подать к столу.

2. Переливание жидкости из стакана в чашку Событие: Жажда или необходимость переноса жидкости. Условие: Стакан наполнен, чашка пуста, между ними свободное пространство. Действие: Взять стакан → Наклонить его над чашкой → Дождаться полного переливания → Поставить пустой стакан обратно.

3. Включение компьютера Событие: Пользователь нажал кнопку питания. Условие: Компьютер подключён к сети, кнопка исправна. Действие: Нажать кнопку → Система подаст сигнал на материнскую плату → Запустится процесс загрузки BIOS → Загрузится операционная система → Появится рабочий стол.

4. Отправка сообщения по электронной почте Событие: Автор написал текст письма. Условие: Адрес получателя указан верно, подключение к интернету стабильно. Действие: Открыть почтовый клиент → Ввести адрес получателя → Вставить текст → Нажать кнопку «Отправить» → Получить уведомление об успешной отправке.

5. Покупка билета в кино Событие: Посетитель подошёл к кассе. Условие: У посетителя есть деньги, сеанс не продан полностью. Действие: Назвать название фильма и время сеанса → Передать деньги кассиру → Получить билет → Зайти в зал.

6. Запись рецепта в книгу Событие: Повар придумал новое блюдо. Условие: Книга открыта, ручка под рукой. Действие: Открыть новую страницу → Написать название блюда → Перечислить ингредиенты → Описать шаги приготовления → Закрыть книгу.

7. Сбор урожая овощей Событие: Сезон сбора урожая наступил. Условие: Овощи созрели, корзина готова. Действие: Пройти по грядкам → Аккуратно сорвать овощи → Положить их в корзину → Перенести корзину в хранилище.

8. Уборка рабочего стола Событие: Конец рабочего дня. Условие: На столе лежат бумаги, кружка, ручки. Действие: Собрать бумаги в стопку → Вынести мусор → Поставить кружку в раковину → Сложить ручки в органайзер → Выключить монитор.

9. Чтение книги Событие: Читатель взял книгу в руки. Условие: Книга доступна для чтения, свет включён. Действие: Открыть первую страницу → Читать строки слева направо → Переворачивать страницу → Дойти до последней страницы → Закрыть книгу.

10. Подготовка к выходу на улицу Событие: Пора выходить. Условие: Одежда выбрана, обувь найдена. Действие: Надеть одежду → Обуться → Взять ключи и сумку → Открыть дверь → Выйти на улицу.

Линейные процессы с проверкой данных

Эти сценарии сохраняют линейную структуру выполнения, но включают обязательные проверки состояния данных перед переходом к следующему шагу. Проверка здесь выступает как условие, без которого действие невозможно выполнить корректно.

11. Проверка возраста для доступа к сайту Событие: Пользователь заполнил форму регистрации. Условие: В поле «Возраст» введено число. Действие: Ввести значение → Сравнить число с пороговым значением (например, 18) → Если число больше или равно порогу → Разрешить доступ → Иначе → Показать сообщение о запрете.

12. Расчёт сдачи в магазине Событие: Покупатель отдал деньги за товар. Условие: Сумма денег больше или равна стоимости товара. Действие: Назвать стоимость товара → Принять сумму от покупателя → Вычесть стоимость из суммы → Вернуть остаток покупателю.

13. Регистрация нового пользователя в системе Событие: Пользователь заполнил анкету. Условие: Все обязательные поля заполнены, пароль соответствует требованиям сложности. Действие: Проверить заполнение полей → Проверить сложность пароля → Создать учётную запись → Сохранить данные в базу → Отправить приветственное письмо.

14. Проверка наличия товара на складе Событие: Поступил заказ от клиента. Условие: Код товара указан в заказе. Действие: Найти товар по коду → Проверить количество на складе → Если количество больше нуля → Резервировать товар → Если количество равно нулю → Сообщить об отсутствии.

15. Подтверждение оплаты счета Событие: Клиент оплатил счет через банк. Условие: Номер счета верен, сумма поступила. Действие: Получить подтверждение от банка → Сверить номер счета → Сверить сумму → Обновить статус счета в системе → Отправить квитанцию клиенту.

16. Обработка возврата товара Событие: Клиент принёс товар обратно. Условие: Товар сохранён, чек присутствует. Действие: Проверить целостность упаковки → Сверить товар с чеком → Проверить сроки возврата → Вернуть деньги → Оформить акт возврата.

17. Создание резервной копии файла Событие: Пользователь запустил программу бэкапа. Условие: Файл существует, место на диске свободно. Действие: Найти файл → Скопировать его содержимое → Сохранить в папку резервных копий → Обновить лог операции.

18. Фильтрация списка контактов Событие: Администратор запросил список активных пользователей. Условие: База данных содержит записи с полями «Статус». Действие: Прочитать все записи → Проверить поле «Статус» → Если статус «Активен» → Добавить в новый список → Если статус «Заблокирован» → Пропустить → Сохранить новый список.

19. Автоматическое продление подписки Событие: Наступила дата окончания подписки. Условие: Способ оплаты активен, баланс достаточен. Действие: Проверить дату → Проверить способ оплаты → Списать средства → Продлить срок действия подписки → Отправить уведомление.

20. Валидация формы входа Событие: Пользователь ввёл логин и пароль. Условие: Логин и пароль не пусты. Действие: Проверить наличие логина → Проверить наличие пароля → Запросить у базы данных совпадение → Если совпадение найдено → Войти в систему → Если совпадение не найдено → Показать ошибку.

Алгоритмы с разветвлением (нелинейные)

Нелинейные алгоритмы содержат условия, которые направляют выполнение процесса по разным путям. Это дерево решений, где каждый узел — это проверка условия, а ветви — возможные варианты развития событий.

21. Выбор маршрута в навигаторе Событие: Пользователь ввёл пункт назначения. Условие: Доступны разные типы дорог (быстрая, короткая, платная). Действие: Проанализировать пробки → Сравнить время проезда по разным маршрутам → Если маршрут А быстрее → Выбрать маршрут А → Иначе если маршрут Б короче → Выбрать маршрут Б → Иначе выбрать маршрут В.

22. Определение статуса заказа Событие: Менеджер проверяет статус заказа. Условие: Заказ имеет атрибуты «Дата», «Статус», «Способ доставки». Действие: Проверить текущую дату → Если дата позже ожидаемой → Статус «Просрочен» → Если дата раньше ожидаемой → Статус «В пути» → Если дата совпадает → Статус «Готов к выдаче».

23. Классификация клиентов Событие: Система анализирует покупки клиента. Условие: Есть история покупок и общая сумма трат. Действие: Посчитать сумму всех покупок за год → Если сумма больше 100 000 рублей → Присвоить статус «VIP» → Если сумма от 50 000 до 100 000 → Присвоить статус «Премиум» → Иначе присвоить статус «Стандарт».

24. Обработка ошибки при печати Событие: Пользователь нажал кнопку «Печать». Условие: Принтер подключён, есть бумага, уровень чернил. Действие: Проверить подключение принтера → Если не подключён → Показать ошибку «Нет соединения» → Если подключён → Проверить наличие бумаги → Если нет бумаги → Показать ошибку «Нет бумаги» → Если бумага есть → Проверить уровень чернил → Если низкий → Показать предупреждение → Если всё ок → Начать печать.

25. Выбор тарифного плана Событие: Клиент выбирает тариф. Условие: Потребности в трафике и звонках. Действие: Запросить объем необходимых гигабайт → Запросить количество минут → Если нужны большие объемы → Предложить тариф «Максимум» → Если нужны только звонки → Предложить тариф «Звонки» → Иначе предложить тариф «Базовый».

26. Система рекомендаций товаров Событие: Пользователь просматривает категорию «Спорт». Условие: История просмотров пользователя. Действие: Анализировать историю → Если пользователь смотрел кроссовки → Показать рекламу носков → Если пользователь смотрел велосипеды → Показать защиту для шлема → Если ничего не найдено → Показать популярные товары категории.

27. Обработка возврата средств Событие: Банк получил запрос на возврат. Условие: Срок возврата не истёк, сумма корректна. Действие: Проверить срок → Если срок истёк → Отказать в возврате → Если срок не истёк → Проверить сумму → Если сумма превышает лимит → Запросить одобрение руководителя → Если лимит не превышен → Одобрить возврат.

28. Управление доступом к ресурсам Событие: Сотрудник пытается войти в систему. Условие: У сотрудника есть права доступа. Действие: Проверить роль сотрудника → Если роль «Администратор» → Открыть все разделы → Если роль «Менеджер» → Открыть разделы управления → Если роль «Сотрудник» → Открыть только личные данные → Иначе → Отказать в доступе.

29. Логика работы умного дома Событие: Датчик движения зафиксировал активность. Условие: Время суток, состояние системы безопасности. Действие: Проверить время → Если ночь → Включить свет в коридоре → Если день → Не включать свет → Проверить режим охраны → Если включён → Отправить тревожное оповещение → Если выключен → Игнорировать событие.

30. Определение типа ошибки в программе Событие: Программа завершилась с ошибкой. Условие: Тип исключения, код ошибки. Действие: Считать код ошибки → Если код 404 → Сообщение «Ресурс не найден» → Если код 500 → Сообщение «Ошибка сервера» → Если код 403 → Сообщение «Доступ запрещён» → Иначе → Показать общий код ошибки.

Сложные бизнес-процессы

Эти алгоритмы объединяют множество условий, циклов и этапов, характерных для реальных бизнес-процессов. Они требуют тщательного проектирования и учёта множества переменных.

31. Процесс обработки заказа в интернет-магазине Событие: Клиент нажал кнопку «Оформить заказ». Условие: Корзина не пуста, аккаунт создан. Действие: Проверить наличие товаров на складе → Если товары есть → Сформировать счёт → Отправить клиенту → Если товаров нет → Уведомить о дефиците → После оплаты → Проверить оплату → Если оплата прошла → Передать заказ в складской отдел → Если оплата не прошла → Вернуть заказ в корзину → Складской отдел формирует упаковку → Курьер забирает заказ → Доставляет клиенту → Получает подпись → Закрывает заказ.

32. Система кредитования в банке Событие: Клиент подал заявку на кредит. Условие: Данные клиента, кредитная история, доход. Действие: Запросить кредитную историю → Оценить риск → Если риск низкий → Рассчитать ставку → Если риск средний → Повысить ставку → Если риск высокий → Отказать → Рассчитать ежемесячный платеж → Предложить условия клиенту → Если клиент согласен → Подписать договор → Выдать деньги → Начать начисление процентов.

33. Процесс найма сотрудников Событие: Отдел кадров получил резюме. Условие: Резюме соответствует вакансии. Действие: Провести первичный скрининг → Если резюме подходит → Назначить собеседование → Провести собеседование → Оценить навыки → Если оценка положительная → Проверить рекомендации → Если рекомендации хорошие → Сделать предложение о работе → Если предложение принято → Оформить документы → Ввести в курс дела.

34. Управление запасами на складе Событие: Ежедневная проверка остатков. Условие: Текущие остатки ниже минимального уровня. Действие: Сравнить текущий остаток с минимальным → Если остаток ниже → Создать заявку на закупку → Отправить заявку поставщику → Дождаться поставки → Принять товар → Обновить учетную запись → Если остаток выше → Не предпринимать действий.

35. Система поддержки клиентов Событие: Клиент оставил заявку в чате. Условие: Тема обращения, срочность. Действие: Классифицировать тему → Если тема техническая → Перенаправить в техподдержку → Если тема финансовая → Перенаправить в бухгалтерию → Если тема срочная → Позвонить клиенту сразу → Если не срочная → Ответить в течение 24 часов → Решить проблему → Закрыть заявку.

36. Процесс обновления программного обеспечения Событие: Система проверяет наличие обновлений. Условие: Подключение к интернету, версия ПО. Действие: Проверить версию текущего ПО → Если есть новая версия → Скачать обновление → Проверить целостность файла → Остановить работу программы → Установить обновление → Перезапустить программу → Проверить работоспособность → Если ошибка → Откатить изменения → Если успех → Сообщить пользователю.

37. Маркетинговая кампания Событие: Планирование рекламной акции. Условие: Целевая аудитория, бюджет, каналы продвижения. Действие: Определить целевую аудиторию → Выбрать каналы продвижения → Разработать контент → Запустить рекламу → Мониторить эффективность → Если кликов мало → Изменить креатив → Если конверсия высокая → Увеличить бюджет → Если конверсия низкая → Прекратить кампанию → Подвести итоги.

38. Обучение новых сотрудников Событие: Новичок приступил к работе. Условие: Наличие наставника, учебные материалы. Действие: Провести инструктаж по технике безопасности → Выдать доступы к системам → Назначить наставника → Провести вводный тренинг → Дать первые задачи → Проверить выполнение → Корректировать обучение → После успешного прохождения испытательного срока → Официально принять на работу.

39. Процесс аудита безопасности Событие: Начало ежегодного аудита. Условие: Наличие доступа к системам, план аудита. Действие: Составить список систем для проверки → Проверить настройки доступа → Сканировать на уязвимости → Проверить логи → Составить отчет о нарушениях → Предложить меры по устранению → Проверить выполнение мер → Закрыть аудит.

40. Разработка продукта Событие: Идея продукта утверждена. Условие: Команда разработчиков, ресурсы. Действие: Создать прототип → Протестировать прототип → Собрать обратную связь → Внести изменения → Разработать MVP → Провести бета-тестирование → Исправить ошибки → Запустить релиз → Мониторить использование → Планировать следующие версии.

Алгоритмы с циклами и повторениями

Циклические алгоритмы подразумевают многократное выполнение одного и того же блока действий до выполнения определённого условия. Это основа автоматизации рутинных задач.

41. Подсчет суммы чисел в диапазоне Событие: Нужно найти сумму чисел от 1 до 100. Условие: Текущее число меньше или равно 100. Действие: Инициализировать сумму нулем → Инициализировать счетчик единицей → Пока счетчик меньше или равен 100 → Прибавить счетчик к сумме → Увеличить счетчик на единицу → Когда условие нарушено → Вывести итоговую сумму.

42. Поиск максимального элемента в списке Событие: Есть список чисел. Условие: Есть ещё не проверенные элементы. Действие: Взять первый элемент как максимум → Пройти по всем остальным элементам → Если текущий элемент больше максимума → Заменить максимум на текущий элемент → Когда список закончен → Вывести максимальное значение.

43. Проверка пароля с ограничением попыток Событие: Пользователь вводит пароль. Условие: Количество попыток меньше пяти. Действие: Попросить ввести пароль → Проверить правильность → Если пароль верный → Войти в систему → Если пароль неверный → Увеличить счетчик ошибок → Если счетчик достиг пяти → Заблокировать учетную запись → Иначе → Попросить ввести пароль снова.

44. Генерация таблицы умножения Событие: Нужно вывести таблицу умножения на 5. Условие: Множитель меньше или равен 10. Действие: Инициализировать множитель единицей → Пока множитель меньше или равен 10 → Умножить 5 на множитель → Вывести результат → Увеличить множитель → Когда условие нарушено → Закончить.

45. Обход всех файлов в папке Событие: Нужно обработать все файлы в директории. Условие: Есть необработанные файлы. Действие: Найти первый файл → Если файл существует → Обработать файл (например, скопировать) → Перейти к следующему файлу → Когда файлы закончились → Завершить операцию.

46. Поиск слова в тексте Событие: Нужно найти слово «алгоритм» в книге. Условие: Есть ещё неоткрытые страницы. Действие: Открыть первую страницу → Прочитать строки → Если найдено слово → Запомнить позицию → Перейти к следующей странице → Когда страницы закончились → Вывести все найденные позиции.

47. Сортировка списка методом пузырька Событие: Есть неупорядоченный список чисел. Условие: Есть соседние элементы, которые нужно поменять местами. Действие: Пройти по списку → Сравнить соседние элементы → Если левый больше правого → Поменять их местами → Повторить проход по списку → Пока за один проход не было обменом элементов → Список отсортирован.

48. Мониторинг температуры сервера Событие: Каждую минуту нужно проверять температуру. Условие: Сервер работает. Действие: Подождать одну минуту → Прочитать датчик температуры → Если температура выше нормы → Включить вентиляторы → Если температура критическая → Отправить тревожное сообщение → Вернуться к началу цикла.

49. Автоматическое создание резервных копий Событие: Наступило время создания копии. Условие: Есть новые файлы с момента последней копии. Действие: Проверить время последнего бэкапа → Найти все изменённые файлы → Скопировать их в архив → Обновить метку времени последнего бэкапа → Вернуться к ожиданию следующего раза.

50. Оптимизация нагрузки на сервер Событие: Нагрузка на сервер выросла. Условие: Количество запросов превышает порог. Действие: Подсчитать количество запросов → Если количество больше порога → Добавить дополнительный сервер → Перераспределить нагрузку → Если количество упало ниже порога → Удалить лишний сервер → Вернуться к мониторингу.